package com.clstu.Object_;

public class Finalize_ {
    public static void main(String[] args) {
        Car bwm = new Car("bwm");
        int[] nums1={1,2,3,0,0,0};
        System.out.println(nums1.hashCode());
        int[] nums2={2,5,6};
        bwm.merge(nums1,3,nums2,3);
        for (int i = 0; i < nums1.length; i++) {
            System.out.print(nums1[i]+"  ");
        }
        System.out.println();
        System.out.println(nums1.hashCode());
        //bwm=null;//bwm对象就再也没有被调用的机会了，所以会被jvm中的垃圾回收器自动回收
        //自动回收垃圾就是jvm定时调用 不会再被引用的对象的finalize方法将他们销毁

        // finalize() 是被动调用的，不是主动调用的，且时间是由系统确定的
        //但是可以通过System.gc()调用一下回收机制

//        System.gc();//不会立即执行，会跳过这条语句后面再来执行，最终会回收掉这个不被引用的垃圾
//        System.out.println("程序继续执行....");
    }
}

class Car{
    private String name;

    public Car(String name) {
        this.name = name;
    }

    @Override
    protected void finalize() throws Throwable {
        super.finalize();//调用父类Object的finalize方法，回收空间，释放资源
        System.out.println("对象"+name+"已被回收");
        System.out.println(name+"对象已经无了");
    }

    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int[] help=new int[m+n];
        int k=0;
        int i=0;
        int j=0;
        for(;i<m&&j<n;){
            help[k++]=nums1[i]<nums2[j]?nums1[i++]:nums2[j++];
        }
        while(i<m){
            help[k++]=nums1[i++];
        }
        while(j<n){
            help[k++]=nums2[j++];
        }
        for (int l = 0; l < help.length; l++) {
            System.out.print(help[l]+"  ");
        }
        System.out.println();
        System.out.println(nums1.hashCode());
        nums1=help;//这里的覆盖并不会带到外面去，所以原先的nums1没有变成不可调用的垃圾
                  // 外面的nums1对象仍然是原先指向的对象
        for (int x = 0; x < nums1.length; x++) {
            System.out.print(nums1[x]+"  ");
        }

        System.out.println();
        System.out.println(nums1.hashCode());
    }
}